package org.alvin.gencode.design;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import lombok.extern.slf4j.Slf4j;
import org.alvin.gencode.AbstractService;
import org.alvin.gencode.beans.PropConfig;
import org.alvin.gencode.run.code.CodeDao;
import org.alvin.gencode.run.code.ICodeDao;
import org.alvin.gencode.run.code.PostgreCodeDao;
import org.alvin.gencode.run.code.Table;
import org.alvin.gencode.run.service.JDBC2MbTypeService;
import org.alvin.gencode.run.service.VmFileService;
import org.alvin.mini_inject.annotations.MiniComponent;
import org.alvin.mini_inject.annotations.MiniInject;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@MiniComponent
public class GenDocWithOneTemplateDService extends AbstractService {

    @MiniInject
    private CodeDao codeDao;
    @MiniInject
    private PostgreCodeDao postgreCodeDao;

    @MiniInject
    private VmFileService vmFileService;
    @MiniInject
    private JDBC2MbTypeService jdbc2MbTypeService;


    @Override
    public ICodeDao getCodeDaoByType(String dbType) {
        if ("postgre".equals(dbType)) {
            return this.postgreCodeDao;
        }
        return this.codeDao;
    }
//
//    public static void main(String [] args){
//        Map<String, Object> params = new HashMap<>();
//
//        // TODO 渲染其他类型的数据请参考官方文档
//        DecimalFormat df = new DecimalFormat("######0.00");
//        Calendar now = Calendar.getInstance();
//        double money = 0;//总金额
//        //组装表格列表数据
//        List<Map<String,Object>> typeList=new ArrayList<Map<String,Object>>();
//        for (int i = 0; i < 2; i++) {
//            Map<String,Object> detailMap = new HashMap<String, Object>();
//            detailMap.put("index", i+1);//序号
//            if(i == 0){
//                detailMap.put("sub_type", "监督技术装备");//商品所属大类名称
//            }else if(i == 1){
//                detailMap.put("sub_type", "火灾调查装备");//商品所属大类名称
//            }else if(i == 2){
//                detailMap.put("sub_type", "工程验收装备");//商品所属大类名称
//            }
//
//            double saleprice=Double.valueOf(String.valueOf(100+i));
//            Integer buy_num=Integer.valueOf(String.valueOf(3+i));
//            String buy_price="1111";
//            detailMap.put("buy_price", buy_price);//所属大类总价格
//            money=money+Double.valueOf(buy_price);
//            typeList.add(detailMap);
//        }
//        //组装表格列表数据
//        List<Map<String,Object>> detailList=new ArrayList<Map<String,Object>>();
//        for (int i = 0; i < 3; i++) {
//            Map<String,Object> detailMap = new HashMap<String, Object>();
//            detailMap.put("index", i+1);//序号
//            if(i == 0 || i == 1){
//                detailMap.put("product_type", "二级分类1");//商品二级分类
//            }else{
//                detailMap.put("product_type", "二级分类2");//商品二级分类
//            }
//            detailMap.put("title", "商品"+i);//商品名称
//            detailMap.put("product_description", "套");//商品规格
//            detailMap.put("buy_num", 3+i);//销售数量
//            detailMap.put("saleprice", 100+i);//销售价格
//            detailMap.put("technical_parameter", "技术参数"+i);//技术参数
//            detailList.add(detailMap);
//        }
//
//
//        List<Map<String,Object>> tList=new ArrayList<Map<String,Object>>();
//        Map<String,Object> tMap = new HashMap<String, Object>();
//        tMap.put("index", 1);
//        tMap.put("sub_type", "监督技术装备");
//        tMap.put("detailList", detailList);
//        tMap.put("buy_price", 100);
//        tList.add(tMap);
//
//        tMap = new HashMap<String, Object>();
//        tMap.put("index", 2);
//        tMap.put("sub_type", "火灾调查装备");
//        tMap.put("detailList", detailList);
//        tMap.put("buy_price", 200);
//        tList.add(tMap);
//
//        tMap = new HashMap<String, Object>();
//        tMap.put("index", 3);
//        tMap.put("sub_type", "工程验收装备");
//        tMap.put("detailList", detailList);
//        tMap.put("buy_price", 300);
//        tList.add(tMap);
//
//
//        //总金额
//        String order_money=String.valueOf(money);
//        //金额中文大写
//        String money_total ="1111";
//
//        //word模板地址获取方式一：缺点---打jar包获取不到该路径
////			String basePath=ClassUtils.getDefaultClassLoader().getResource("").getPath()+"static/template/";
////			String resource =basePath+"order2.docx";//word模板地址
//        //word模板地址获取方式二：优点---相比上一种方式，这种方法不会在linux或者jar上失效
//
//        //渲染表格  动态行
//        HackLoopTableRenderPolicy  policy = new HackLoopTableRenderPolicy();
//        Configure config = Configure.newBuilder()
//                .bind("typeList", policy).bind("detailList", policy).build();
//        System.out.println(config);
//    }

    @Override
    public void doCreate(List<Table> tables, PropConfig propConfig) throws IOException, SQLException {
        //需要循环的变量配置
        HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
        Configure config = Configure.newBuilder()
                .bind("tables", policy)
                .bind("flist",policy)
                .build();
        //组装对象
        List<JSONObject> tableVars = tables.stream().map(item ->{
            JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(item));
            try {
                jsonObject.put("flist",getFields(item,propConfig));
                jsonObject.put("title",item.getComment());
            } catch (SQLException e) {
                e.printStackTrace();
            }
            System.out.println(jsonObject);
            return jsonObject;
        }).collect(Collectors.toList());
        //渲染模板
        XWPFTemplate template = XWPFTemplate.compile(this.getClass().getResourceAsStream("/templates/onedoctemplate.docx"), config).render(
                new HashMap<String, Object>() {{
                    put("title",propConfig.getModuleName());
                    put("tables", tableVars);
                    put("date",new SimpleDateFormat("yyyy-MM-DD HH:mm:ss").format(new Date()));
                    put("author",propConfig.getAuthor());
                }}
        );
        //输出
        String outDir = propConfig.getConfigDir().concat(File.separator).concat("dist");
        File dir = new File(outDir);
        dir.mkdirs();

        File file = new File(dir, "数据库设计文档.docx");
        if (file.exists() && file.isFile()) {
            file.delete();
        }
        FileOutputStream out = new FileOutputStream(file);
        template.write(out);
        out.flush();
        out.close();
        template.close();
    }

}
